"""
多继承
子类可以拥有多个父类，并且具有所有父类的属性和方法
格式:
class 子类名(父类名1,父类名2...):
    语句
"""

# 实例
# class a:
#     def test(self):
#         print("a")
# class b:
#     def demo(self):
#         print("b")
#         print(self)
#
# class c(a,b):
#     pass
#
# ccc = c()
# ccc.test()
# ccc.demo()

"""
多继承可以让子类对象同时拥有多个父类的属性和方法 
减少重复代码降低程序的冗余
"""

"""
多继承注意事项

开发时应该避免父类中同名的属性或者方法
如果父类中存在同名的属性或方法，应该尽量避免使用多继承
"""

# class A:
#     def test(self):
#         print("testA")
#     def demo(self):
#         print("demoA")
# class B:
#     def test(self):
#         print("testB")
#     def demo(self):
#         print("demoB")
#
# class C(A,B):
#     pass
#
# ccc = C()
# ccc.demo()
# ccc.test()
#
# class D(B,A):
#     pass
#
# ddd = D()
# ddd.test()
# ddd.demo()

# 原理MRO

"""
MRO方法搜索顺序
method resolution order
python中提供了__mro__属性可以查看方法搜索顺序
mro主要用于多继承是判断方法、属性的调用路径

在多继承搜索方法时，是按照mro的输出结果从左到右顺序查找
如果找到方法，直接执行，不在搜索
如果没有找到就查找下一个类中知否有对应方法
如果最后没有找到，报错
"""


# class A:
#     def test(self):
#         print("testA")
#     def demo(self):
#         print("demoA")
# class B:
#     def test(self):
#         print("testB")
#     def demo(self):
#         print("demoB")
#
# class C(A,B):
#     pass
#
#
# print(C.__mro__)
# (
# <class '__main__.C'>,
# <class '__main__.A'>,
# <class '__main__.B'>,
# <class 'object'>
# )
# 返回一个元祖，mro在搜索方法时，按该元祖顺序查找
# object是所有类的基类，所有类都继承自object

"""
新式类和经典类
object是所有类的父类，提供内置的属性和方法，可以使用dir函数查看
新式类：以object为基类的类，推荐使用
经典类：不以object为基类的类，不推荐使用

python3中所有的类都是新式类，
定义类时如果没有执行父类，默认使用object作为基类

如果需要保证代码能在py2和py3中同时运行
如果没有父类，则：
class 类名(object):
    代码
"""